Dirty Checking 이란
Entity Manager가 변경이 발생한 엔티티를 자동 감지하여 DB에 반영하는 것이다.
이미 영속화된 엔티티들을 대상으로만 작동하여, 준영속상태이거나 비영속상태인 엔티티들은 Dirty Checking을 진행하지 않는다.
동작 방법
JPA가 엔티티를 조회할 때 해당 엔티티의 상태를 기반으로 하나의 스냅샷을 만든다.
그 후, 트랜잭션이 종료되는 시점에 만든 스냅샷과 비교하여 변경을 감지한다.
변경이 감지되면 update 쿼리를 DB에 전달한다.
즉, 영속화된 엔티티라면 별도로 save 메서드를 사용하지 않아도 JPA 에 의해 변경 사항이 자동으로 데이터베이스에 적용된다.
변경된 부분만 업데이트하기
Dirty Checking이 이루어지는 update 쿼리는 기본적으로 모든 필드를 업데이트한다.
생성되는 쿼리가 같아 부트 실행 시점에 미리 만들어 재사용 가능하고, DB 입장에서 쿼리 재사용이 가능하다.
그러나 필드가 많은 엔티티의 경우 모든 필드 업데이트는 부담스러울 수 있다. 데이터의 양이 많아질수록 그렇다.
이런 경우에는 @DynamicUpdate
엔티티 최상단에 선언해주면 변경된 필드만 반영되도록 할 수 있다.
@Entity
@DynamicUpdate
public class Vero {
...
}